package main

import (
	// "runtime"
	"fmt"
	"net"
	// "errors"
	// "encoding/base64"
	// "io/fs"
	// "os"
	// "time"
	"encoding/json"
	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/mem"
	"github.com/shirou/gopsutil/disk"
	"github.com/shirou/gopsutil/host"
	// log "github.com/sirupsen/logrus"

)

type INFO struct{
	CPU      int     `json:"cpu"`
	Mem      uint64  `json:"mem"`
	Disk     uint64  `json:"disk"`

	Version  string  `json:"version"`

	System   string  `json:"system"`
	Hostname string  `json:"hostname"`
	LocalIP  string  `json:"localIP"`
	PublicIP string  `json:"publicIP"`
}

func (self *INFO)getLocalIP() {
	// 创建 UDP 连接
	conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.IPv4(8, 8, 8, 8), Port: 53})
	if err != nil {
		logger.Println("无法创建 UDP 连接:", err)
		return
	}
	defer conn.Close()

	// 获取本地 IP 地址
	localAddr := conn.LocalAddr().(*net.UDPAddr)
	logger.Println("本地 IP 地址:", localAddr.IP.String())
	self.LocalIP = localAddr.IP.String()
}

// func (self *INFO)Get() dict{
// 	return dict {
// 		"cpu": self.cpu,
// 		"mem": self.mem,
// 		"disk": self.disk,
// 		"system": self.system,
// 		"hostname": self.hostname,
// 		"localIP": self.localIP,
// 		"publicIP": self.publicIP,
// 	}
// }

func (self *INFO)String() string {
	data, err := json.Marshal(self)
	if err != nil {
		// fmt.Println("无法转换为 JSON:", err)
		return "{}"
	}
	return string(data)
}

func (self *INFO)Init() {

	self.Version = fmt.Sprintf("%s.%s.%s", major, minor, version)
	self.getLocalIP()

	// logger.Printf("失败 %v", full_path)
	cpuInfo, _ := cpu.Info()
	// if err == nil {
	// 	logger.Println("CPU信息:")
	// 	for _, info := range cpuInfo {
	// 		logger.Printf("Model: %s, Cores: %d\n", info.ModelName, info.Cores)
	// 	}
	// }
	self.CPU = len(cpuInfo)

	memInfo, _ := mem.VirtualMemory()
	// if err == nil {
	// 	logger.Println("内存信息:")
	// 	logger.Printf("总量: %d MB, 可用: %d MB\n", memInfo.Total/1024/1024, memInfo.Available/1024/1024)
	// }
	self.Mem = memInfo.Total/1024/1024

	// diskInfo, err := disk.Partitions(false)
	// if err == nil {
	// 	// logger.Println("磁盘信息:")
	// 	for _, info := range diskInfo {
	// 		fmt.Printf("info=%+v\n", info)
			usage, _ := disk.Usage("/")
			// usage, err := disk.Usage(info.Mountpoint)
			// if err != nil {
			// 	continue
			// }
			// fmt.Printf("%+v\n", usage)
			// logger.Printf("Mountpoint: %s, Total: %d GB, Free: %d GB\n", info.Mountpoint, usage.Total/1024/1024/1024, usage.Free/1024/1024/1024)
			self.Disk += usage.Total/1024/1024/1024
	// 	}
	// }

	hostInfo, _ := host.Info()
	// if err == nil {
	// 	logger.Println("主机信息:")
	// 	logger.Println("操作系统:", hostInfo.OS)
	// 	logger.Println("主机名:", hostInfo.Hostname)
	// }
	// return false
	self.Hostname = hostInfo.Hostname
	self.System   = hostInfo.OS
}
